#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<omp.h>


#define ARQUIVO_PEQUENO 0
#define ARQUIVO_GRANDE 1
#define MAXLENGTH 200


/* Struct para a tabela de primos utlizados pelo Algoritmo Crivo de Erastótenes */
typedef struct
{
	int *prime_list;
    int last_index;
    int last_prime;
    int max_len;
}primos;


/* Percorre uma string até achar um separador. */
/* O retorno é o offset do ultimo caracter antes do separador ou o EOF. */
int busca_UltimoSeparadorString(char *str, int indice, char separador[]);

/* Cria uma string começando no byte_inicio do arquivo e terminando */
/* em byte_fim e a armazena na partição.							*/
void cria_Particao(FILE *arq, char **particao, int byte_inicio, int byte_fim);

/* Percorre o arquivo até achar um separador. */
/* O retorno é o offset do ultimo caracter antes do separador ou o EOF. */
int busca_UltimoSeparador(FILE *arq, int offset, char separador[]);

/* Realoca a lista de primos caso seja ela estoure MAXLENGTH */
void realoca (primos **p, int novo_tamanho);

/* Armazena em 'palavranova' a string 'palavra' sem o char 'caracter' */
void removeCaracter(char* palavra, char caracter, char* palavranova);

/* Verifica se 'palavra' é um palíndromo.					*/
/* Retorna a soma ASCII da palavra caso seja um palíndromo. */
/* Retorna um número negativo caso contrário. 				*/
int verificaPalindromo(char* palavra, int PARALLEL);

/* Imprime todos os palíndromos de palavra existentes em na string 'str' */
/* Armazena em um arquivo separado para palavras */
void imprimePalindromos_Palavra(char *str, char separador[], primos *list, FILE *palind_palavra, int parallel);

/* Imprime todos os palíndromos de frase existentes em na string 'str' */
/* Armazena em um arquivo separado para frases */
void imprimePalindromos_Frase(char *str, char separador[], primos *list, FILE *palind_frase, int parallel);

/* Algoritmo Crivo de Eratóstenes: 							  */
/*   Armazena todos os primos abaixo de 'valor' em uma lista. */
/*	 A função retorna true se é primo ou false caso não seja. */
int crivo(primos *list, int valor, int PARALLEL);
